ルート遷移レコードと遷移代理人の更新
まとめ
新しいブールゲッターisWaitingForExitingDecision
追加されました
ルート遷移レコードとisEntering
ゲッター
に名前が変更されましたisWaitingForEnteringDecision
。
の中にresolve()
遷移デリゲートのメソッド、
使用isWaitingForExitingDecision
終了しているかどうかを確認する
ルートは実際には、どのように移行するかについて明示的な決定を必要とします
画面の外に。既存のルートを決定しようとする場合
それかではありません決定を待っていると、Flutter はアサーション エラーをスローします。
コンテクスト
ナビゲーターは新しいページのリストを受け取ると、そのリストを更新しようとします。
現在のルートはリストと一致するようにスタックされます。ただし、明示的な情報が必要です
ルートを画面上と画面外でどのように移行するかを決定します。
以前は、新しいリストにないルートには決定が必要でした
画面外に遷移する方法について。しかし、後でわかったのですが、
これは常に真実であるとは限りません。ルートがポップされた場合、
ただし、ポップアニメーションが終了するのをまだ待っています。
このルートは、ナビゲータのルート スタックに存在することになります。
アニメーションができました。この間にページの更新が行われた場合、
このルートは終了しますが、決定は必要ありません
画面外に遷移する方法について。したがって、isWaitingForExitingDecision
そのケースをカバーするために追加されました。
のisEntering
getter の名前も次のように変更されます。isWaitingForEnteringDecision
もっと説明すると、
また、命名をより一貫性のあるものにするためでもあります。
移行ガイド
独自の遷移デリゲートを実装する場合は、
ゲッターを使用してルートを終了するisWaitingForExitingDecision
あなたの前に
電話markForPop
、markForComplete
、 またmarkForRemove
それらの上に。
また、からのすべての参照の名前を変更する必要があります。isEntering
にisWaitingForEnteringDecision
。
移行前のコード:
import 'package:flutter/widgets.dart';
class NoAnimationTransitionDelegate extends TransitionDelegate<void> {
@override
Iterable<RouteTransitionRecord> resolve({
List<RouteTransitionRecord> newPageRouteHistory,
Map<RouteTransitionRecord, RouteTransitionRecord> locationToExitingPageRoute,
Map<RouteTransitionRecord, List<RouteTransitionRecord>> pageRouteToPagelessRoutes,
}) {
final List<RouteTransitionRecord> results = <RouteTransitionRecord>[];
for (final RouteTransitionRecord pageRoute in newPageRouteHistory) {
if (pageRoute.isEntering) {
pageRoute.markForAdd();
}
results.add(pageRoute);
}
for (final RouteTransitionRecord exitingPageRoute in locationToExitingPageRoute.values) {
exitingPageRoute.markForRemove();
final List<RouteTransitionRecord> pagelessRoutes = pageRouteToPagelessRoutes[exitingPageRoute];
if (pagelessRoutes != null) {
for (final RouteTransitionRecord pagelessRoute in pagelessRoutes) {
pagelessRoute.markForRemove();
}
}
results.add(exitingPageRoute);
}
return results;
}
}
移行後のコード:
import 'package:flutter/widgets.dart';
class NoAnimationTransitionDelegate extends TransitionDelegate<void> {
@override
Iterable<RouteTransitionRecord> resolve({
List<RouteTransitionRecord> newPageRouteHistory,
Map<RouteTransitionRecord, RouteTransitionRecord> locationToExitingPageRoute,
Map<RouteTransitionRecord, List<RouteTransitionRecord>> pageRouteToPagelessRoutes,
}) {
final List<RouteTransitionRecord> results = <RouteTransitionRecord>[];
for (final RouteTransitionRecord pageRoute in newPageRouteHistory) {
// Renames isEntering to isWaitingForEnteringDecision.
if (pageRoute.isWaitingForEnteringDecision) {
pageRoute.markForAdd();
}
results.add(pageRoute);
}
for (final RouteTransitionRecord exitingPageRoute in locationToExitingPageRoute.values) {
// Checks the isWaitingForExitingDecision before calling the markFor methods.
if (exitingPageRoute.isWaitingForExitingDecision) {
exitingPageRoute.markForRemove();
final List<RouteTransitionRecord> pagelessRoutes = pageRouteToPagelessRoutes[exitingPageRoute];
if (pagelessRoutes != null) {
for (final RouteTransitionRecord pagelessRoute in pagelessRoutes) {
pagelessRoute.markForRemove();
}
}
}
results.add(exitingPageRoute);
}
return results;
}
}
タイムライン
リリースされたバージョン: 1.18.0
安定版リリース: 1.20
参考文献
API ドキュメント:
Navigator
TransitionDelegate
RouteTransitionRecord
関連する問題:
- 問題 45938: ナビゲーター 2.0
関連する PR:
- PR 55998: ナビゲーター ページの更新クラッシュを修正しました。 まだ待機ルートがある場合